/**
 * date :2010-11-10
 * comment : 
 * 
 * 			BoardServiceImpl
 * 
 */
package wetogether.community.service;

import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import wetogether.community.dao.BoardDAO;
import wetogether.community.vo.BoardVO;
import wetogether.community.vo.CommentsVO;
import wetogether.community.vo.ContentListVO;
import wetogether.community.vo.ListVO;
import wetogether.community.vo.PagingBean;

public class BoardServiceImpl implements BoardService {
	private Log log = LogFactory.getLog(getClass());
	private BoardDAO boardDAO;
	
	public void setBoardDAO(BoardDAO boardDAO) {
		this.boardDAO = boardDAO;
		System.out.println("BoardDAO injection...");
	}
	/**
	 * 댓글 입력
	 * date : 2010-11-12
	 * author : Kim Jong-sun
	 * comment : 
	 * 해당 sequence 얻기 -> DB 저장 -> 날짜 세팅 -> 해당 게시물 댓글 수 up
	 */
	@Override
	public void addComments(CommentsVO commentsVO) throws SQLException {
		// 시퀀스 얻고 DB insert
		int commentsSequence = boardDAO.getSelectCommentsSeq();
		commentsVO.setCommentsId(commentsSequence);							// commentsId 세팅
		boardDAO.insertComments(commentsVO);								// DB입력
		// 날짜 세팅
		String regDate = boardDAO.getCommentsDate(commentsSequence);		// DB에 입력된 시간 얻어오기
		commentsVO.setRegDate(regDate);										// 등록일 세팅
		commentsVO.setModDate(regDate);										// 등록일 세팅
		// 해당 게시물의 댓글 수 update
		boardDAO.updateCommentsHitsUp(commentsVO.getContentId());
		
		log.debug("BoardService addComments OK! " + commentsVO.toString());
	}

	@Override
	public void addContent(BoardVO boardVO) throws SQLException {
		int seq=boardDAO.getSelectContentSeq();
		if(boardVO.getGroupDepth()==0)
			boardVO.setGroupId(seq);			
		boardVO.setContentId(seq);		
		boardDAO.insertContent(boardVO);
		String date=boardDAO.getContentDate(seq);
		boardVO.setRegDate(date);
		boardVO.setModDate(date);
		if(boardVO.getAttachmentVO()!=null) {
			int attSeq=boardDAO.getSelectAttachmentSeq();
			boardVO.getAttachmentVO().setFileId(attSeq);
			boardVO.getAttachmentVO().setContentId(seq);
			boardDAO.insertAttachment(boardVO.getAttachmentVO());
		}		
	}
	
	/**
	 * date : 2010-11-07
	 * author : Shin In-soo
	 * comment :	
	 * 		답글을 삽입하는 메서드
	 * 		insertPos : 답글을 넣을 position을 가지는 변수
	 * 		checkGroupPosition() : 답글을 삽입할 위치를 리턴하는 메서드 
	 * 			-리턴값이 null(-1) : 제일 뒤(Max(position)+1)에다 삽입
	 * 			-리턴값이 숫자 : 그 위치에 삽입  
	 */
	@Override
	public void addReply(BoardVO boardVO) throws SQLException {
		int insertPos=boardDAO.checkGroupPosition(boardVO);
		if(insertPos==-1) {
			insertPos=boardDAO.findMaxGroupPosition(boardVO)+1;
		}
		boardVO.setGroupPosition(insertPos);
		boardVO.setGroupDepth(boardVO.getGroupDepth()+1);
		this.addContent(boardVO);
	}
	
	/**
	 * 댓글 삭제
	 * date : 2010-11-12
	 * author : Kim Jong-sun
	 * comment : 
	 * commentsId 에 해당하는 댓글 DB에서 삭제 -> contentId의 댓글 수 down
	 */
	@Override
	public void deleteComments(int contentId, int commentsId) throws SQLException {
		// 댓글 삭제
		boardDAO.deleteComments(commentsId);
		// 댓글 삭제 후 해당 게시물 댓글 수 update(down)
		boardDAO.updateCommentsHitsDown(contentId);
		log.debug("BoardService deleteComments OK! contentId : " + contentId + ", commentsId : " + commentsId);
	}

	@Override
	public void deleteContent(int contentId) throws SQLException {
		boardDAO.deleteContent(contentId);
	}

	/**
	 * 댓글 목록 가져오기
	 * date : 2010-11-12
	 * author : Kim Jong-sun
	 * comment :
	 * contentId 에 해당하는 댓글 목록을 가져온다.
	 */
	@Override
	public ArrayList<CommentsVO> getCommentsList(int contentId) throws SQLException {
		ArrayList<CommentsVO> commentsList = boardDAO.getCommentsList(contentId);
		log.debug("BoardService getCommentsList OK! " + commentsList.toString());
		return commentsList;
	}

	@Override
	public BoardVO getContent(int contentId) throws SQLException {
		BoardVO vo=boardDAO.getContent(contentId);
		vo.setAttachmentVO(boardDAO.getAttachment(contentId));
		boardDAO.updateHits(contentId);
		System.out.println("[SERVICE]getContent "+ vo);
		return vo;
	}

	/**
	 * 글 목록 보는 메서드
	 * 목록 뽑을 때 검색어가 없다면 전체 글 목록으로 보여주고, 검색어가 있다면 해당 검색어에 맞는 글 목록을 보여준다.
	 */
	@Override
	public ListVO getContentList(ContentListVO contentListVO) 	throws SQLException {
		ListVO lvo = null;
		ArrayList<BoardVO> list = boardDAO.getContentList(contentListVO);
		PagingBean pagingBean = new PagingBean(boardDAO.totalContent(contentListVO), Integer.parseInt(contentListVO.getPage()));
		lvo = new ListVO(list, pagingBean);
		return lvo;
	}

	@Override
	public void modifyContent(int contentId) throws SQLException {

	}
}